﻿using System;
using Microsoft.Practices.Prism.ViewModel;

namespace CPN.PJN.Silverlight.Core.Infrastructure.Common
{
    /// <summary>
    /// Classe de base utilisée pour les ViewModels
    /// </summary>
    public abstract class ViewModel : NotificationObject, IDisposable
    {
        #region IsLoading Property

        /// <summary>
        /// Etat de chargement
        /// </summary>
        public bool IsLoading
        {
            get { return LoadingCounter > 0; }
        }

        #endregion

        #region LoadingCounter Property

        /// <summary>
        /// Compteur de chargement pour les appels asynchrones
        /// </summary>
        private int loadingCounter;

        /// <summary>
        /// Compteur de chargement pour les appels asynchrones
        /// </summary>
        protected int LoadingCounter
        {
            get
            {
                return loadingCounter;
            }
            set
            {
                loadingCounter = value;
                RaisePropertyChanged(() => this.IsLoading);
            }
        }

        #endregion
        
        #region Initialize Method

        /// <summary>
        /// Cette méthode permet l'initialisation le ViewModel
        /// </summary>
        protected abstract void Initialize();

        #endregion

        #region Dispose Methods

        /// <summary>
        /// Implémentation de l'interface Disposable
        /// </summary>
        public void Dispose()
        {
            this.Dispose(true);
            GC.SuppressFinalize(this);
        }

        /// <summary>
        /// Implémentation de la méthode Dispose
        /// </summary>
        /// <param name="disposing">Disposé ou pas</param>
        protected virtual void Dispose(bool disposing)
        {
            if (disposing)
            {
                // Nettoie les ressources managées
            }

            // Nettoie les ressources non managées
        }

        #endregion
    }
}